﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;



namespace HA.MT3DMS.FileLayer
{
   public  class PMIniFile
   {
       #region 构造函数  目前使用的第二个构造函数

       /// <summary>
       /// 还需要考虑，如果传入多个binToUnf.exe生成的文件进行处理，可能会由于外部传入参数的原因导致处理数据出错，尤其是第一个参数
       ///  暂时按照外围一次传入全部binToUnf.exe生成的文件进行处理。
       /// </summary>
       /// <param name="binToUnfOutputFilePath">每个mt3d001.ucn经过binToUnf.exe后生成的文件完整路径的列表   注意顺序</param> 
       public PMIniFile(List <string> binToUnfOutputFilePath)
       {


           this._concFiles = new List<PMConcFile>();

           for (int i = 0; i < binToUnfOutputFilePath.Count; i++)
           {

               if (System.IO.File.Exists(binToUnfOutputFilePath[i]))
               {
                   string fileName = System.IO.Path.GetFileName(binToUnfOutputFilePath[i]);

                   PMConcFile conc = new PMConcFile(fileName);

                   this._concFiles.Add(conc);
               }

           }



       }

       /// <summary>
       /// 传入参数为污染物个数
       /// </summary>
       /// <param name="specisNumber"></param>
       public PMIniFile(int specisNumber)
       {
           this._concFiles = new List<PMConcFile>();

           for (int i = 0; i < specisNumber; i++)//污染物的个数 对应要生成的  MT3D001文件夹  等的个数
           {
               //每个 MT3D001文件夹 中生成的浓度文件的控制信息  其生成的文件个数决定于 应力期*时间不长*传输补偿

               string ucnFileName = "";

               ucnFileName = FileNameConfigHelper.GetInputFileName(i);


               PMConcFile conc = new PMConcFile(ucnFileName);

               this._concFiles.Add(conc);


           }


       }


       public PMIniFile(int numSpecis, List<PmStressPeriod> spConfig)
       {

           //this._concFiles = new List<PMConcFile >();

           //for (int i = 0; i < numSpecis; i++)//污染物的个数 对应要生成的  MT3D001文件夹  等的个数
           //{
           //    //每个 MT3D001文件夹 中生成的浓度文件的控制信息  其生成的文件个数决定于 应力期*时间不长*传输补偿
           //    string ucnFileName = "mt3d001.ucn";

           //    if (i < 10)
           //    {
           //        ucnFileName = "MT3D" + "00" + (i + 1).ToString() + ".ucn";
           //    }
           //    else if (i >= 10 && i <= 99)
           //    {
           //        ucnFileName = "MT3D" + "0" + (i + 1).ToString() + ".ucn";
           //    }
           //    else if (i >= 100)
           //    {
           //        ucnFileName = "MT3D" + (i + 1).ToString() + ".ucn";
           //    }

           //    //ConcFile conc = new ConcFile(ucnFileName, "mt3d.cnf", "");
           //    PMConcFile conc = new PMConcFile(ucnFileName);

           //    this._concFiles.Add(conc);

           //}


           ////this._stressPeriodSetup = spConfig;

       
       }



       #endregion


       #region 字段属性


       List<PMConcFile> _concFiles = new List<PMConcFile>();

       public List<PMConcFile> ConcFiles
       {
           get { return _concFiles; }
       }



       int _readFormat = 2;

       public int ReadFormat
       {
           get { return _readFormat; }
           set { _readFormat = value; }
       }


       int _numI;

       public int NumI
       {
           get { return _numI; }
           set { _numI = value; }
       }
       int _numJ;

       public int NumJ
       {
           get { return _numJ; }
           set { _numJ = value; }
       }

       int _numK;

       public int NumK
       {
           get { return _numK; }
           set { _numK = value; }
       }





       #endregion


       #region 公有方法
       /// <summary>
       /// 传入的路径为文件夹位置的绝对路径 例如：C:\Documents and Settings\Administrator\桌面\mt3d\solutions
       /// 将在该文件夹下创建 pm1.ini  pm2.ini等配置文件
       /// </summary>
       /// <param name="path"></param>
       public void WriteFiles(string path)
       {

           //注意：bin.txt ,console3.exe ,pm.ini需要放在同一个文件夹下 ，否则需要在 pm.ini 中的输入文件名处添加相对于 console3.exe的路径

           //传入的路径为文件夹位置的绝对路径 例如：C:\Documents and Settings\Administrator\桌面\mt3d\solutions

           #region 首先进行一些简单的数据有效性判断

           if (this._concFiles == null )
           {
               return;
           }


           #endregion

           System.IO.FileStream fs = null;
           System.IO.StreamWriter sw = null;

           try
           {
               #region

               for (int index = 0; index < this._concFiles.Count; index++)
               {
                   if (index >= 0 && index <= 999)
                   {
                       string concName = this._concFiles[index].ConcName;// 例如： mt3d001.ucn  mt3d002.ucn   mt3d003.ucn 等


                       //生成的浓度文件名的保存暂时未实现  因为该文件名的规则是在 dos 内部控制的 ，外围不可见，貌似是默认1,2,3,4。。。。。。。。。。。。

                       List<string> outputFileName = this._concFiles[index].OutFileNameList;//存放动态生成的文件名    引用传递

                       if (outputFileName == null)
                       {
                           outputFileName = new List<string>();
                       }
                       else
                       {
                           outputFileName.Clear();
                       }


                       #region 创建并写入对应的 pm.ini 配置文件参数信息  ，并记录动态生成的输出浓度文件名称信息

                       //首先是文件夹的信息
                       string directoryPath = path + FileNameConfigHelper.GetMT3DResultDirectoryName(index);
                       if (!System .IO.Directory .Exists (directoryPath ))
                       {
                             this.CreatNewFileDirectory(directoryPath);
                       }
                     
                       //然后是配置文件的信息
                       string filePath = path+ FileNameConfigHelper .GetMT3DResultPmIniName (index );
                       if (System .IO .File .Exists (filePath ))
                       {
                           System.IO.File.Delete(filePath );
                       }

                       fs = new System.IO.FileStream(filePath, System.IO.FileMode.CreateNew);
                       sw = new System.IO.StreamWriter(fs);

                       string line1 = concName + "         " + "          */unformatted file name" ;
                       string line2 = this._readFormat.ToString() + "                                  */1: LF95-style unformatted; 2: true binary" ;
                       string line3 = this._numJ.ToString() + "   " + this._numI.ToString() + "   " + this._numK.ToString() + "                                  */列(J) 行(I) 层(K)";
                       string line4 = FileNameConfigHelper.GetMT3DResultDirectoryName (index);

                       sw.WriteLine(line1);
                       sw.WriteLine(line2);
                       sw.WriteLine(line3);
                       sw.WriteLine(line4);


                       sw.Close();
                       fs.Close();


                       #endregion

                   }// if (index >= 0 && index <= 999) 结束

               }// for (int index = 0; index < this._concFiles.Count; index++)  结束


               #endregion


           }
           catch
           {
               if (sw != null)
               {
                   sw.Close();
               }
               if (fs != null)
               {
                   fs.Close();
               }
               System.Windows.Forms.MessageBox.Show("生成 pm.ini 配置文件过程出错！");
               return;
           }


       
       }

       #endregion

       #region 私有方法

         /// <summary>
        /// 创建文件夹 如 ：pm1  如果存在就删除内容，并新建；不存在则创建
       /// </summary>
       /// <param name="directoryPath"></param>
       private void CreatNewFileDirectory(string directoryPath)
       {
           try
           {

               if (System.IO.Directory.Exists(directoryPath))
               {

                   System.IO.Directory.Delete(directoryPath, true);
               }

               System.IO.Directory.CreateDirectory(directoryPath);

           }
           catch
           {

               System.Windows.Forms.MessageBox.Show("创建文件夹的过程出错！");
               return;
           }

       }

       #endregion

       #region


       #endregion

   }
}
